【PL/SQL】EXISTS 函数 比 IN 更优 | 您所在的位置:网站首页 › there exist用法 › 【PL/SQL】EXISTS 函数 比 IN 更优 |
看完这章你会学习到以下内容:1. Exist函数的用法2. 比IN函数返回数据更优吗?使用范围? 经典案例:查询员工表里所属部门和部门名称 方法一套用子查询,员工表的部门编号在部门表里也出现,而且只返回部门表。当然,可以用连接的,一般也可以用子查询套用。 SELECT D.* FROM DEPT D WHERE DEPTNO IN (SELECT DEPTNO FROM EMP);方法二:使用EXISTS函数一般而言,跟在Where筛选语句后面,然后在子查询里写两张表或者多张表的匹配条件。就像Join后面的On语句。 EXISTS(查询结果集):查询结果集有记录则成立,否则不成立NOT EXISTS(查询结果集):与EXISTS相反语句解释:如果在子查询里面有返回值,则为真,则在原筛选语句里返回对应的值。如果在子查询里没有返回值,则为假,则在原筛选语句里返回表的字段名。 SELECT D.* FROM DEPT D WHERE EXISTS (SELECT 1 FROM EMP E WHERE E.DEPTNO = D.DEPTNO);为什么说,Exists函数比IN查询效率更好?这是真的吗? A: IN 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。 如果查询的两个表大小相当,那么用in和exists差别不大。EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用: 当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次.A表有10000条记录,B表有1000000条记录,最多有可能遍历10000*1000000次,效率很差.再如:A表有10000条记录,B表有100条记录,最多有可能遍历10000*100次,遍历次数大大减少,效率大大提升. 结论:in()适合B表比A表数据小的情况 当B表比A表数据大时适合使用exists(),因为它没有那么遍历操作,只需要再执行一次查询就行.如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等.如:A表有10000条记录,B表有100000000条记录,那么exists()还是执行10000次,因为它只执行A.length次,可见B表数据越多,越适合exists()发挥效果.再如:A表有10000条记录,B表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快. 结论:exists()适合B表比A表数据大的情况 补充资料:https://blog.csdn.net/msynl311833/article/details/100019323 NOT EXIST用法SQL中IN和EXISTS用法的区别 - 测试人生- - 博客园 |
CopyRight 2018-2019 实验室设备网 版权所有 |